using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(AimWeaponEvent))]
[DisallowMultipleComponent]
public class AimWeapon : MonoBehaviour
{
    #region Tooltip
    [Tooltip("使用子 WeaponRotationPoint 游戏对象的 Transform 进行填充")]
    #endregion

    [SerializeField] private Transform weaponRotationPointTransform;

    private AimWeaponEvent aimWeaponEvent;
    
    private void Awake()
    {
        // 加载组件
        aimWeaponEvent = GetComponent<AimWeaponEvent>();
    }

    private void OnEnable()
    {
        // 订阅瞄准武器活动
        aimWeaponEvent.OnWeaponAim += AimWeaponEvent_OnWeaponAim;
    }

    private void OnDisable()
    {
        // 取消订阅瞄准武器活动
        aimWeaponEvent.OnWeaponAim -= AimWeaponEvent_OnWeaponAim;
    }

    /// <summary>
    /// 瞄准武器事件处理程序
    /// </summary>
    private void AimWeaponEvent_OnWeaponAim(AimWeaponEvent aimWeaponEvent, AimWeaponEventArgs aimWeaponEventArgs)
    {
        Aim(aimWeaponEventArgs.aimDirection, aimWeaponEventArgs.aimAngle);
    }

    /// <summary>
    /// 瞄准武器
    /// </summary>
    private void Aim(AimDirection aimDirection, float aimAngle)
    {
        // 设置武器变换的角度
        weaponRotationPointTransform.eulerAngles = new Vector3(0f, 0f, aimAngle);

        // 根据玩家方向翻转武器变形
        switch (aimDirection)
        {
            case AimDirection.Left:
            case AimDirection.UpLeft:
                weaponRotationPointTransform.localScale = new Vector3(1f, -1f, 0f);
                break;

            case AimDirection.Up:
            case AimDirection.UpRight:
            case AimDirection.Right:
            case AimDirection.Down:
                weaponRotationPointTransform.localScale = new Vector3(1f, 1f, 0f);
                break;
        }
    }

    #region Validation

#if UNITY_EDITOR
    /// <summary>
    /// 在Unity编辑器中，当组件的属性发生变化时调用此方法进行验证。
    /// 它主要用于确保weaponRotationPointTransform属性不为null，以避免运行时错误。
    /// </summary>
    private void OnValidate()
    {
        // 使用HelperUtilities的ValidateCheckNullValue方法验证weaponRotationPointTransform是否为null。
        // 如果为null，Unity编辑器将显示错误消息。
        HelperUtilities.ValidateCheckNullValue(this, nameof(weaponRotationPointTransform),
            weaponRotationPointTransform);
    }

#endif

    #endregion
}